# 1. создание функции get_first_news()
import json
import time
import requests
from bs4 import BeautifulSoup
from datetime import datetime


def get_first_news():
    # создаём словарь заголовков и помещаем в него параметр
    # user-agent
    headers = {
        "user-agent":
            "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 124.0.0.0 YaBrowser / 24.6.0.0 Safari / 537.36"
    }
    # обозначим переменную url. Это будет ссылка на сайт
    url = "https://www.securitylab.ru/news"
    # отправляем GET-запрос (в параметры передаём url-адрес и заголовки
    # headers)
    r = requests.get(url=url, headers=headers)
    # print(r.text)
    # cоздаём объект Beatiful Soup, первым параметром передаём текст
    # запроса, а вторым - парсер "lxml"
    soup = BeautifulSoup(r.text, "lxml")
    # соберём все тэги <a> в список:
    articles_cards = soup.find_all("a", class_="article-card")
    # print(articles_cards)
    # в цикле пройдёмся по нашему списку и соберём интересующую информацию:
    # - название статьи
    # - дата публикации
    # - краткое описание
    # - ссылка на саму статью
    # 2. Создадим словарь для наших новостей
    news_dict = {}
    for article in articles_cards:
        # заберём сначала название статьи
        article_title = article.find("h2", class_="article-card-title").text.strip()
        # получим краткое описание
        article_desc = article.find("p").text.strip()
        # получим url-статьи с добавлением домена
        article_url = f'https://www.securitylab.ru{article.get("href")}'
        # получим и дату и время публикации статьи (эти данные хранятся
        # в ISO-формате)
        article_date_time = article.find("time").get("datetime")
        # преобразуем дату и время
        # в формат unix timestamp(число секунд с 1 января 1970)
        date_from_iso = datetime.fromisoformat(article_date_time)
        date_time = datetime.strftime(date_from_iso, "%Y-%m-%d %H:%M:%S")
        article_date_timestamp = time.mktime(
            datetime.strptime(date_time, "%Y-%m-%d %H:%M:%S").timetuple()
        )
        # выведем результат того, что получилось
        # print(f"{article_title} | {article_url} | {article_date_timestamp}")
        # поместим данные в словарь:
        # ключ - идентификатор статьи
        # значение - собранные ранее данные
        # Разобьём ссылку по разделителю слеш "/" и заберём последний элемент
        article_id = article_url.split("/")[-1]
        # Обрежем лишние символы, чтобы остался только номер
        article_id = article_id[:-4]
        news_dict[article_id] = {
            "article_date_timestamp": article_date_timestamp,
            "article_title": article_title,
            "article_url": article_url,
            "article_desc": article_desc
        }
    # сохраним результат нашей работы в JSON-файл
    with open("news_dict.json", "w", encoding="utf-8") as file:
        # при помощи метода dump() сохраним словарь в файл
        # параметры: словарь, имя JSON-файла отступ и доп.параметр
        json.dump(news_dict, file, indent=4, ensure_ascii=False)


#  3. проверка обновления новостей на сайте
def check_news_update():
    with open("news_dict.json", encoding="utf-8") as file:
        # загрузим список новостей из JSON-файла
        news_dict = json.load(file)
        # выведем то, что получилось
        # print(news_dict)
        # 4. Нам необходимо отправить скрипт на сайт для повторного
        # получения новостей. Поэтому копируем заголовки и url-адрес,
        # и объекты для получения карточек статей
        headers = {
            "user-agent":
                "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 124.0.0.0 YaBrowser / 24.6.0.0 Safari / 537.36"
        }
        # обозначим переменную url. Это будет ссылка на сайт
        url = "https://www.securitylab.ru/news"
        # отправляем GET-запрос (в параметры передаём url-адрес и заголовки
        # headers)
        r = requests.get(url=url, headers=headers)
        # cоздаём объект Beatiful Soup, первым параметром передаём текст
        # запроса, а вторым - парсер "lxml"
        soup = BeautifulSoup(r.text, "lxml")
        # соберём все тэги <a> в список:
        articles_cards = soup.find_all("a", class_="article-card")
        # создадим словарь, в котором будут только свежие новости
        fresh_news = {}
        # Проходимся по списку новостей циклом
        for article in articles_cards:
            # копируем код получения id
            article_url = f"https://www.securitylab.ru{article.get("href")}"
            # Разобьём ссылку по разделителю слеш "/"
            # и заберём последний элемент
            article_id = article_url.split("/")[-1]
            # Обрежем лишние символы, чтобы остался только номер
            article_id = article_id[:-4]
            # если article_id нет в словаре news_dict, то нужно
            # заново получить все данные о статье
            if article_id in news_dict:
                continue
            else:
                # забираем название статьи
                article_title = article.find("h2", class_="article-card-title").text.strip()
                # краткое описание статьи
                article_desc = article.find("p").text.strip()
                # получим ссылку на статью
                article_url = f'https://www.securitylab.ru{article.get("href")}'
                # получим дату и время публикации(эти данные хранятся в ISO-формате)
                article_date_time = article.find("time").get("datetime")
                # преобразуем дату и время в формат unix timestamp
                # (число секунд с 1 января 1970)
                date_from_iso = datetime.fromisoformat(article_date_time)
                date_time = datetime.strftime(date_from_iso, "%Y-%m-%d %H:%M:%S")
                article_date_timestamp = time.mktime(datetime.strptime(date_time,
                                    "%Y-%m-%d %H:%M:%S").timetuple())

                # добавим "новинку" в имеющийся словарь
                news_dict[article_id] = {
                    "article_date_timestamp": article_date_timestamp,
                    "article_title": article_title,
                    "article_url": article_url,
                    "article_desc": article_desc
                }
                # добавим "новинки" в имеющийся словарь
                fresh_news[article_id] = {
                    "article_date_timestamp": article_date_timestamp,
                    "article_title": article_title,
                    "article_url": article_url,
                    "article_desc": article_desc
                }

    # сохраним результат нашей работы в JSON-файл вместо предыдущего
    with open("news_dict.json", "w", encoding="utf-8") as file:
        # с помощью метода dump() сохраняем наш словарь в JSON-файл
        # параметры: словарь, имя JSON-файла, отступ и доп.параметр
        json.dump(news_dict, file, indent=4, ensure_ascii=False)
    return fresh_news




def main():
    # get_first_news()
    # check_news_update()
    print(check_news_update())


# запуск main()
if __name__ == '__main__':
    main()
